Marcelino Mayorga Quesada

Objetivo

El caso consistirá en entrenar un modelo de clasificación binaria para etiquetar las reviews que escriben los usuarios de una plataforma de e-commerce en positivas o negativas en función del sentimiento expresado por el comprador.

Estrategia y Resumén Técnico

Este documento muestra la aplicación técnica de múltiples tecnologías y frameworks para la construcción de múltiples modelos de clasificación binaria. La solución se basa aplicando la arquitectura sugerida y como insumo un dataset con reviews de video juegos de la página de Amazon.

Este documento las siguientes secciones:

Arquitectura de la solución

Importación de Librerías

Fuente de datos

Información

La fuente de datos proviene de productos y reviews de amazon dentro del periodo de Mayo 1996 hasta Julio 2014. Dichos reviews estan hospedados en la siguiente dirección: https://jmcauley.ucsd.edu/data/amazon/.

Definición de Fuente de Datos: Reviews de Video Games

Para este trabajo se seleccionó de manera aleatoria el dataset de "Video games"(video juegos) categoría 5 que cuenta con 231,780 reviews. Dichos datos se encuentra en este enlance: Video Games

Dicho dataset cuenta con las siguentes columnas y una breve descripción obtenidos desde la página oficial.

Para efectos de éste trabajo y siguiendo las instrucciones del enunciado, se utilizarán las columnas reviewText y overall.

Nombre Columna Descripcion Utilizar
reviewerID ID of the reviewer, e.g. A2SUAM1J3GNN3B No
asin ID of the product, e.g. 0000013714 No
reviewerName name of the reviewer No
vote helpful votes of the review No
style a disctionary of the product metadata, e.g., "Format" is "Hardcover" No
reviewText text of the review Si
overall rating of the product Si
summary summary of the review No
unixReviewTime time of the review (unix time) No
reviewTime time of the review (raw) No
image images that users post after they have received the product No

Consideraciones

Carga de datos

Métodos para descarga de Archivo

Valida la existencia del archivo sino lo descarga.

Descargamos el archivo en folder local "/data"

Cargamos los datos crudos (raw) en un dataframe

Validamos la carga con 10 registros

Análisis exploratorio de los datos

Descripción general del dataset

Estructura natural del archivo

Cantidad de Muestras

Nulos

Generación de Reportes y Análisis Univariantes y Multivariantes

Reporte general del dataset

El reporte generado estará adjunto a este documento.

Distribución de Categorías

Siendo la columna "Overall" categórica generamos una distribución porcentual, basado en una escala de 1 a 5.

Histogramas de columna: Overall

Podemos observar la distribución visualmente presentada

Observaciones y Análisis

Consideraciones:

Procesado de datos

Seguidamente se procede a un trabajo de procesado de datos para crear un dataset con alta capacidad predictiva utilizando:

Limpiado de datos

Duplicados: Obtenemos las muestras duplicadas en la columna de "reviewText".

Duplicados: Procedemos a borrar las muestras y observamos la reducción de muestras.

Generación de nuevo dataset de trabajo

Creamos un nuevo dataset con los tipos de datos y columnas correspondientes

Validmos datos en el nuevo dataset

Eliminación de muestras de sentiment = 3

Eliminamos las muestras con un valor de 3

Balanceo de datos

Balanceamos las muestras, aplicando una técnica de Random Undersampling Manual limitando el número de registros basado en el conteo de las categorías 1 y 2 y reduciendo el número de las categorías 4 y 5.

Obtenemos distribución de las columnas

Obtenemos las muestras correspondientes a cada categoría

Creamos un nuevo dataset balanceado, utilizando muestreo y un límite inferior de la distribución (muestras de categoría 1)

Categorización de reviews

Definimos método para agregar etiqueta si el review es "negativa" o "positiva"

Aplicamos la nueva columna "sentiment_label"

Preparación de los conjuntos de train y test

Separamos en conjunto de train y test

Normalización y Extracción de características.

Creamos multiples vectorizers con diferente número de Máximo de Tokens(Max_features)

Seteando dichos valores en: 2500 / 10000 / 50000. Utilizando el mismo dataset balanceado.

Podemos ver algunas de las características (bigramas y trigramas en este caso) que hemos extraído.

Validamos tamaño y Ngrams del dataset - Small

Validamos tamaño y Ngrams del dataset - Medium

Validamos tamaño y Ngrams del dataset - Large

Transformamos nuestros datos en distintos datasets basados en el tamaño de la tokenización a utilizar en el entrenamiento.

Entrenamiento de un modelo de análisis de sentimiento

Al estar en un problema de clasificación binaria, aplicamos múltiples algoritmos que sirven para éste lograr la clasificación de sentimiento:

Para éste proposito se crearon métodos parametrizables para cada uno de los algoritmos y sus modelos, que nos permite ejecutar múltiples veces manteniendo un ambiente de pruebas consistente y para cada ejecución registramos dicha información en MLFlow.

Se crearon múltiples datasets creados basados en el tamaño del vocabulario: Small, Medium, Large, con el hiperparámetro _maxfeatures. Los datasets se utilizarán para entrenar modelos y evaluarlos para obtener diferentes métricas y podemos evaluar el rendimiento en general.

Definición de clase de registro de experimentos

A utilizar en cada ejecución para mantener los resultados en memoria a utilizar en la visualización.

Logistic Regression

Definimos una función para entrenar un modelo con Logistic Regression

Parametrizable con la intención de probar con diferentes sets de entrenamientos. Dicha ejecución se registra en MLFLOW con los hiperparámetros, métricas y modelo utilizado.

Ejecución: Logistic Regression con dataset transformado con un número de tokens: Small

Ejecución: Logistic Regression con dataset transformado con un número de tokens: Medium

Ejecución: Logistic Regression con dataset transformado con un número de tokens: Large

C-Support Vector Classification(SVC)

Definimos una función para entrenar un modelo con C-Support Vector Classification(SVC)

Parametrizable con la intención de probar con diferentes sets de entrenamientos. Dicha ejecución se registra en MLFLOW con los hiperparámetros, métricas y modelo utilizado.

Ejecución: SVC con dataset transformado con un número de tokens: Small

Ejecución: SVC con dataset transformado con un número de tokens: Medium

Ejecución: SVC con dataset transformado con un número de tokens: Large

RandomForestClassifier

Es una variación del k-fold en que retorna pliegues(secciones) stratificados, en cada set contiene aproximadamente el mismo porcentage de cada clase target del set completo, sobre un randomforest.

Ejecución: Random Forest con dataset transformado con un número de tokens: Small

Ejecución: Random Forest con dataset transformado con un número de tokens: Medium

Ejecución: Random Forest con dataset transformado con un número de tokens: Large

Validación y listado de métricas registradas en MLFLOW

Listado de métricas

A continuación se presentan los registros de las distintas evaluaciones anteriormente ejecutados:

Evaluación de modelos

Obtenemos los mejores resultados para cada una de las métricas de las ejecuciones registradas en MLFLOW:

Se muestran por cada métrica, el mejor resultado:

Visualización de métricas

Métodos para graficar resultados

Gráfico de Barras - Resultados de Métricas por Modelo

En el siguiente grafico podemos observar el resultado agrupado por cada una de las métricas ['Accuracy', 'Precision', 'Recall', 'f1-Score'] de los nueve experimentos realizados anteriormente. Cada color de barra representa a un modelo de entrenamiento distinto.

En total se visualizan los resultados de nueve modelos entrenados:

Gráfico de Líneas - Resultados de Métricas por Vectorizer y Modelo de Entrenamiento

En el siguiente grafico podemos observar el resultado de las métricas ['Accuracy', 'Precision', 'Recall', 'f1-Score'] por cada uno de los modelos entrenados y el vectorizer utilizado.

En este caso se visualiza 3 gráficos distintos donde se comparan las metricas obtenidas de los 3 modelos usados anterioirmente ['Logistic Regression', 'SVG', 'Random Forest'] tomando como base el vectorizer utilizado ['Small', 'Medium', 'Large'].